﻿using CAD.DAO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RN
{
    public class MailServer
    {
        private ListDAO listDAO;
        private RecordDAO recordDAO;
        private List<Message> listamensajes = new List<Message>();
        private String nombreservidor;

        /*Constructor del servidor se le pasa el nombre del servidor
        */
        public MailServer(String nombre)
        {
            nombreservidor = nombre;
            listDAO = new ListDAOSQLSERVER();
            recordDAO = new RecordDAOSQLSERVER();
        }

        public MailServer()
        {
            listDAO = new ListDAOSQLSERVER();
            recordDAO = new RecordDAOSQLSERVER();
        }

        /*Getter y Setter del nombre del servidor
        */
        public String Nombreservidor
        {
            get { return nombreservidor; }
            set { nombreservidor = value; }
        }

        /*Metodo que devuelve cuantos mensajes estan sin leer en el servidor de acuerdo al usuario que se le pasa
        */
        public int getMessagesWaiting(String usuario)
        {
            int contador = 0;
            foreach (Message mensaje in listamensajes)
            {
                contador += ContadordeMensajes(usuario, mensaje);
            }
            return contador;
        }

        /*Metodo auxiliar que devuelve cuantos mensajes estan sin leer en el servidor de acuerdo al usuario que se le pasa
        */
        private int ContadordeMensajes(String usuario, Message mensaje)
        {
            int contador = 0;
            CabeceraMensaje destinatario = mensaje.datoscabeceramensaje();
            String to = destinatario.To();
            if (to.Equals(usuario))
            {
                contador++;
            }
            return contador;
        }

        /*Metodo que devuelve los mensajes para ser leido de acuerdo al usuario que se le pasa
        */
        public Message getNextMessage(String usuario)
        {
            foreach (Message mensaje in listamensajes)
            {
                ProximoMensaje(usuario, mensaje);
                return mensaje;
            }
            return null;
        }

        /*Metodo auxiliar que devuelve los mensajes para ser leido de acuerdo al usuario que se le pasa
        */
        private Message ProximoMensaje(String usuario, Message mensaje)
        {
            CabeceraMensaje destinatario = mensaje.datoscabeceramensaje();
            String to = destinatario.To();
            if (to.Equals(usuario))
            {
                listamensajes.Remove(mensaje);
                return mensaje;
            }
            return null;
        }

        /*Metodo que agrega el mensaje enviado a la lista de mensajes
        */
        public void post(Message item)
        {
            recordDAO.insertMessage(item);
            //listamensajes.Add(item);
        }

        /*
         * Metodo que lee el mensaje de un usuario a otro, tomando en cuenta la cabecera
         */         
        public Message readMessage(string from, string to, string Subject)
        {
            foreach (Message m in listamensajes)
            {
                CabeceraMensaje cabecera = m.datoscabeceramensaje();
                CuerpoMensaje cuerpo = m.datoscuerpomensaje();
                if (cabecera.From() == from && cabecera.To() == to && cuerpo.Subject() == Subject)
                {
                    m.IsRead = true;
                    return m;
                }
            }

            return null;
        }

        public Message readMessage(int idMessage)
        {
            Message m = recordDAO.getMessage(idMessage);
            recordDAO.updateMessageAsRead(idMessage);
            return m;
        }

        /*
         * Obtiene una lista de mensajes basados en el usuario
         */
        public List<Message> getMensajes(String usuario)
        {
            List<Message> list = listDAO.ListActiveMails(usuario);
            /*
            List<Message> list = new List<Message>();
            foreach (Message m in listamensajes)
            {
                CabeceraMensaje cm = m.datoscabeceramensaje();
                if (cm.To() == usuario)
                {
                    list.Add(m);
                }
            }*/

            return list;
        }

        public Client validateUserLogin(string usuario, string password)
        {            
            Client cl = recordDAO.validateUser(new Client(usuario, password));
            return cl;
        }
    }
}
